/**
 * Copyright (C), 2019-2023, lepus-dt.comInc. All rights reserved.
 * FileName: I18nMessage
 * Author:   chao.xie
 * Date:     2023.06.06
 */
package org.jeecg.extra.utils;

import cn.hutool.core.util.StrUtil;

import java.util.Locale;
import java.util.ResourceBundle;

/**
 * 国际化工具.
 *
 * <p>用于便捷获取国际化资源文件中的信息.
 * <p>使用方法:
 * <pre>
 * 1. 默认语言环境: I18nMessage.bundle("message").getMessage("key");
 * 2. 指定语言环境: I18nMessage.bundle("message").withLocale(Locale.CHINA).getMessage("key");
 * </pre>
 *
 * @author chao.xie
 * @version 1.0.0
 * @创建日期: 2024.03.15
 */
public class I18nMessage {
    /**
     * 消息文件名称
     */
    private final String message;

    /**
     * 语言环境
     */
    private Locale locale;

    private I18nMessage(String message) {
        this.message = message;
    }

    /**
     * 绑定资源文件.
     *
     * @param message 资源文件名称
     * @return com.lepus.utils.I18nMessage
     * @author chao.xie
     * @创建日期: 2024.03.15
     * @since 1.0.0
     */
    public static I18nMessage bundle(String message) {
        return new I18nMessage(message);
    }

    /**
     * 指定语言环境.
     *
     * @param locale 语言环境
     * @return com.lepus.utils.I18nMessage
     * @author chao.xie
     * @创建日期: 2024.03.15
     * @since 1.0.0
     */
    public I18nMessage withLocale(Locale locale) {
        this.locale = locale;
        return this;
    }

    /**
     * 获取消息.
     *
     * @param key 消息键值
     * @return java.lang.String
     * @author chao.xie
     * @创建日期: 2024.03.15
     * @since 1.0.0
     */
    public String getMessage(String key) {
        ResourceBundle bundle = getResourceBundle();
        if(bundle.containsKey(key)){
            return bundle.getString(key);
        }
        else {
            return key;
        }
    }

    /**
     * 获取带参数消息.
     *
     * @param key  消息键值
     * @param args 参数
     * @return java.lang.String
     * @author chao.xie
     * @创建日期: 2024.03.15
     * @since 1.0.0
     */
    public String getMessage(String key, Object... args) {
        ResourceBundle bundle = getResourceBundle();
        if(bundle.containsKey(key)){
            return StrUtil.format(
                    bundle.getString(key),
                    args);
        }
        else {
            return key;
        }
    }

    private ResourceBundle getResourceBundle() {
        if (locale == null) {
            return ResourceBundle.getBundle(message);
        } else {
            return ResourceBundle.getBundle(message, locale);
        }
    }
}
